
//#include "contract.h"
#include "BSP_IO.h"
#include "IO.h"


static rcu_periph_enum gpio_clock(GP_T gp){
	switch(gp){
	case GPIOA:	return RCU_GPIOA;
	case GPIOB:	return RCU_GPIOB;
	case GPIOC:	return RCU_GPIOC;
	// case GPIOD:	return RCU_GPIOD;
	// case GPIOE:	return RCU_GPIOE;
	// case GPIOF:	return RCU_GPIOF;
	// case GPIOG:	return RCU_GPIOG;
	default:
		while(1);
	}
	//ASSERT(0);
	return (rcu_periph_enum)0;
}

static void bsp_io_set_mode(GP_T gp, Pin_T pin, uint32_t mode){
	switch (mode)
	{
	//输出
	case IO_Mode_OUT:{
		//PP输出
		gpio_mode_set(gp, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, pin);
    	gpio_output_options_set(gp, GPIO_OTYPE_PP, GPIO_OSPEED_166MHZ, pin);
	}
	break;
	case IO_Mode_OD:{
		//OD输出
		gpio_mode_set(gp, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, pin);
    	gpio_output_options_set(gp, GPIO_OTYPE_OD, GPIO_OSPEED_166MHZ, pin);
	}
	break;
	//输入
	case IO_Mode_IN:{
		//浮空输入
		gpio_mode_set(gp, GPIO_MODE_INPUT, GPIO_PUPD_NONE, pin);
	}
	break;
	case IO_Mode_IPU:{
		//输入上拉
		gpio_mode_set(gp, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, pin);
	}
	break;
	case IO_Mode_IPD:{
		//输入下拉
		gpio_mode_set(gp, GPIO_MODE_INPUT, GPIO_PUPD_PULLDOWN, pin);
	}
	break;
	case IO_Mode_AIN:{
		//模拟输入
		gpio_mode_set(gp, GPIO_MODE_INPUT, GPIO_MODE_ANALOG, pin);
	}
	break;
	case IO_Mode_AFPP:{
		//功能PP
		gpio_mode_set(gp, GPIO_MODE_AF, GPIO_PUPD_NONE, pin);
    	gpio_output_options_set(gp, GPIO_OTYPE_PP, GPIO_OSPEED_166MHZ, pin);
	}
	break;
	case IO_Mode_AFOD:{
		//功能OD
		gpio_mode_set(gp, GPIO_MODE_AF, GPIO_PUPD_NONE, pin);
    	gpio_output_options_set(gp, GPIO_OTYPE_OD, GPIO_OSPEED_166MHZ, pin);	
	}
	break;
	default:
		while(1);
	}
}

void BSP_IO_Init(GP_T gp, Pin_T pin, uint32_t mode){	
	rcu_periph_clock_enable(gpio_clock(gp));
	bsp_io_set_mode(gp, pin, mode);
}

void BSP_IO_SetMode(GP_T gp, Pin_T pin, uint32_t mode){
	bsp_io_set_mode(gp, pin, mode);
}

void BSP_IO_Active(GP_T gp){
	rcu_periph_clock_enable(gpio_clock(gp));
}

